Матч 413, Бесконечная последовательность (InfiniteSequence)

Дивизион 2, Уровень 3

 

Рассмотрим бесконечную последовательность А, определенную следующим образом:

A0 = 1,

Ai = A[i/p] + A[i/q] , i ³ 1

По заданным n, p, q вычислить An.

 

Класс: InfiniteSequence

Метод: long long calc(long long n, int p, int q)

Ограничения: 0 £ n £ 1012, 2 £ p, q £ 109.

 

Вход. Целые значения n, p, q.

 

Выход. Значение An.

 

Пример входа

n

p

q

0

2

3

10000000

3

3

256

2

4

 

Пример выхода

1

32768

89

 

 

РЕШЕНИЕ

структуры данных – map, рекурсия

 

Вычислить все значения Ai (i = 0, 1, …, n) последовательности невозможно при помощи массива из-за ограничения n £ 1012. Для запоминания результатов будем использовать структуру map: значение m[i] будет хранить Ai. Находим значение An, запоминая промежуточные результаты.

 

ПРОГРАММА

 

#include <cstdio>

#include <map>

using namespace std;

 

map<long long,long long> m;

 

class InfiniteSequence

{

public:

  long long calc(long long n, int p, int q)

  {

    if (m[n]) return m[n];

    if (!n) return 1;

    return m[n] = calc(n/p,p,q) + calc(n/q,p,q);

  }

};